#include <iostream>
using namespace std;
class Base1 {
public:
	virtual void func1() { cout << "Base1::func1" << endl; }
	virtual void func2() { cout << "Base1::func2" << endl; }
private:
	int b1;
};

class Base2 {
public:
	virtual void func1() { cout << "Base2::func1" << endl; }
	virtual void func2() { cout << "Base2::func2" << endl; }
private:
	int b2;
	int bb;
};

class Derive : public Base2, public Base1 {
public:
	virtual void func1() { cout << "Derive::func1" << endl; }
	virtual void func3() { cout << "Derive::func3" << endl; }
private:
	int d1;
};
//// 用程序打印虚表
typedef void(*VF_PTR)();
//void PrintVFTable(VF_PTR table[])
void PrintVFTable(VF_PTR* table,int n)
{
    //vs以nullptr结尾，但Linux不是，需要自己计算个数
//	for (int i = 0; table[i] != nullptr; ++i)
//	{
//		printf("[%d]:%p->", i, table[i]);
//		VF_PTR f = table[i];
//		f();
//	}
    for(int i=0;i<n;++i)
    {
        printf("[%d]:%p",i,table[i]);
        //调用函数
        table[i]();
    }

	cout << endl;
}

int main()
{
    Base1 b;
    //要强制类型转换,只能用于32位平台下
//    PrintVFTable((VF_Ptr*)(*(int*)&b));
    //因为64位和32位平台的指针大小不一样
    //这样我们解引用就是一个指针大小了
    PrintVFTable((VF_PTR*)(*(void**)&b),2);
    Derive d;
    PrintVFTable((VF_PTR*)(*(void**)&d),3);
    Base2 b2;
    PrintVFTable((VF_PTR*)(*(void**)&b2),2);

    return 0;
}
